home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / comm / dnet / mailchk5 / part02 < prev    next >
Text File  |  1990-07-03  |  26KB  |  1,044 lines

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i193: mailchk 05 - mail client+server for DNet, Part02/03 (REPOST)
  5. Message-ID: <13036@xanth.cs.odu.edu>
  6. Date: 3 Jul 90 15:20:19 GMT
  7. Sender: news@cs.odu.edu
  8. Reply-To: <lobster@quiche.cs.mcgill.ca>
  9. Lines: 1030
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: <lobster@quiche.cs.mcgill.ca>
  15. Posting-number: Volume 90, Issue 193
  16. Archive-name: comm/dnet/mailchk-05/part02
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 2 (of 3)."
  25. # Contents:  amiga/client/mailchk.c
  26. # Wrapped by tadguy@xanth on Tue Jul  3 08:56:46 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'amiga/client/mailchk.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'amiga/client/mailchk.c'\"
  30. else
  31. echo shar: Extracting \"'amiga/client/mailchk.c'\" \(23145 characters\)
  32. sed "s/^X//" >'amiga/client/mailchk.c' <<'END_OF_FILE'
  33. X/*
  34. X *    MAILCHK.C
  35. X *
  36. X *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  37. X *
  38. X *    Check the mailbox and reports if new mail
  39. X *    has arrived.
  40. X *
  41. X *    Written by S. Laroche.
  42. X *    April 19, 1990
  43. X *
  44. X *    Usage:    mailchk [-N(host) -s(flag) -w(flag) -t(time) -q
  45. X *        -h:  Help message
  46. X *        -s:  flag=0: Don't talk; otherwise talk
  47. X *        -w:  flag=0: No window; other open a window
  48. X *        -t:  (time) is the number of seconds between checks.
  49. X *             Default:  40 seconds
  50. X *        -q:  Remove mailchk
  51. X *        -h:  help message
  52. X *
  53. X *    Arp.library is needed... (Version 39.1)
  54. X */
  55. X
  56. X#include <stdio.h>
  57. X#include <local/typedefs.h>
  58. X#include <libraries/arpbase.h>
  59. X#include "/dnet/channel.h"
  60. X#include "/server/servers.h"
  61. X#include <local/deemu.h>
  62. X#include "mailmenu.h"          /* menu definitions */
  63. X
  64. X/* Icon images */
  65. X#define YOUHAVEMAIL 0
  66. X#define NEWMAIL     1
  67. X#define NOMAIL        2
  68. X
  69. X/* Server commands */
  70. X#define GETNEWMAIL  1
  71. X#define GETMAILMSG  2
  72. X#define DELMAILMSG  3
  73. X#define INITSERVER  4
  74. X#define EDITMESSAGE 5
  75. X
  76. X/* For use with Matt Dillon's config utility */
  77. Xshort Deemu[] = {
  78. X    DMSTRT, 0, 0,
  79. X    DMNW  , 0, 4,  0, 10,
  80. X/*    DMNW  , 0, 10, 2, 2, -80, 40, 0xFFFF, */
  81. X    DMEND , 0, 0
  82. X};
  83. X
  84. X#define DMICONNWOFF  4
  85. X/* #define DMNWOFF     14 */
  86. X
  87. X/* Buffer lengths */
  88. X#define MAILLENGTH 256      /* Max. number of characters in 1 msg header */
  89. X#define BUFLENGTH  512      /* Length of buffer used for communication */
  90. X
  91. X/* Intuition shortcuts */
  92. X#define MENUSTRIP(n) (SHIFTMENU(n)|SHIFTITEM(NOITEM))
  93. X#define BUSYPOINTER(n) (SetPointer(n, BusyPointer, 22, 16, 0, 0))
  94. X#define IDCMPFLAGS NEWSIZE|MENUPICK|CLOSEWINDOW|MOUSEBUTTONS
  95. X
  96. X/* Storage defined in mailchk_chip.c */
  97. Xextern USHORT BusyPointer[];           /* Busy pointer image      */
  98. Xextern struct Image MbImage;           /* Mailbox icon          */
  99. Xextern USHORT MbBitMap[3][48*36];      /* Images for mailbox icon */
  100. X
  101. X/* Globals */
  102. Xubyte Title[128];    /* Window title */
  103. Xubyte MailVersion[80];    /* Version number, formatted for Title */
  104. X
  105. X/* Windows and gadgets */
  106. XNW Nw = {
  107. X    0, 20, 640, 100, -1, -1,
  108. X    NULL,
  109. X    WINSTD|NOCAREREFRESH,
  110. X    NULL, NULL, Title, NULL, NULL,
  111. X    32, 18, -1, -1, WBENCHSCREEN
  112. X};  /* Headers window */
  113. X
  114. Xstatic struct Gadget gadget =        /* Used to display the mailbox */
  115. X{ NULL,
  116. X  0, 0, 0, 0,
  117. X  GADGHNONE|GRELWIDTH|GRELHEIGHT|GADGIMAGE,
  118. X  GADGIMMEDIATE|RELVERIFY,
  119. X  WDRAGGING,
  120. X  (APTR) &MbImage,
  121. X  NULL,
  122. X  NULL,
  123. X  NULL,
  124. X  NULL,
  125. X  0, 0
  126. X};  /* Mailbox icon */
  127. X
  128. Xstatic NW IconNW =      /* The mailbox window */
  129. X{ 0, 11,
  130. X  48, 36,
  131. X  -1, -1,
  132. X  GADGETDOWN|MENUPICK,
  133. X  BORDERLESS|SMART_REFRESH|NOCAREREFRESH,
  134. X  &gadget,
  135. X  NULL,
  136. X  NULL,
  137. X  NULL,
  138. X  NULL,
  139. X  0, 0, 0, 0,
  140. X  WBENCHSCREEN
  141. X}; /* Window for icon */
  142. X
  143. X/* linked lists of headers */
  144. Xstruct MailMsg {
  145. X  char msg[MAILLENGTH];
  146. X  struct MailMsg *next;
  147. X};
  148. X
  149. Xstruct MailMsg *MailP=NULL;  /* 1st pointer of linked list      */
  150. XUSHORT NumMsg = 0;         /* Number of messages in linked list */
  151. X
  152. X/* Message struct to communicate between two running mailchk */
  153. Xstruct mailmsg {
  154. X  struct Message ml_msg;
  155. X  unsigned long secs;
  156. X  BYTE quit, speak, win;
  157. X};
  158. X
  159. X
  160. XWIN *Win = NULL, *MbWin = NULL;
  161. XRP  *Rp;
  162. X
  163. Xchar DefaultSpeaker[] = "SPEAK:";  /* Used when env. var. SPEAKER isn't set */
  164. X
  165. Xlong IntuitionBase;
  166. Xlong GfxBase;
  167. Xlong ArpBase;
  168. X
  169. Xstruct FileRequester *FileReq = NULL;
  170. XPORT *MailPort = NULL;
  171. X
  172. XBYTE SpeakPlease = 2, WindowPlease = 2;
  173. X
  174. Xmain(ac,av)
  175. X
  176. Xchar *av[];
  177. X
  178. X{
  179. X    long chan = NULL;
  180. X    unsigned long numsecs = 0L;
  181. X    BYTE firstrun = 1, quit = 0;
  182. X    char *host = NULL;
  183. X    int i;
  184. X
  185. X    ArpBase = (long)OpenLibrary(ArpName,39L);
  186. X    if (ArpBase == NULL) exit(1);
  187. X
  188. X    if (!param(ac,av,&numsecs,&quit,&host)) {
  189. X       CloseLibrary(ArpBase);
  190. X       exit(0);
  191. X    }
  192. X    {
  193. X      char buf[64];
  194. X      PORT *pr;
  195. X
  196. X      sprintf(MailVersion, "MailChkV%s%s ", VERSION, MAILCHK_VERSION);
  197. X      strncpy(buf,MailVersion,7);
  198. X      buf[7] = '\0';
  199. X      strcat(MailVersion, " - April 25 1990");
  200. X      Enable_Abort = 0;
  201. X      if (pr = FindPort(buf)) {
  202. X      PORT *mailrp;
  203. X      struct mailmsg *mailmsg;
  204. X
  205. X      if (!(mailrp = CreatePort(NULL,0))) goto fail;
  206. X      if (!(mailmsg = (struct mailmsg *) AllocMem(sizeof(struct mailmsg),
  207. X                        MEMF_PUBLIC))) {
  208. X        DeletePort(mailrp);
  209. X        goto fail;
  210. X      }
  211. X      mailmsg->ml_msg.mn_Node.ln_Type = NT_MESSAGE;
  212. X      mailmsg->ml_msg.mn_Length = sizeof(struct mailmsg);
  213. X      mailmsg->ml_msg.mn_ReplyPort = mailrp;
  214. X      mailmsg->secs = numsecs;
  215. X      mailmsg->quit = quit;
  216. X      mailmsg->speak = SpeakPlease;
  217. X      mailmsg->win = WindowPlease;
  218. X      PutMsg(pr,mailmsg);
  219. X      Wait(1 << mailrp->mp_SigBit | SIGBREAKF_CTRL_C);
  220. X      DeletePort(mailrp);
  221. X      FreeMem(mailmsg,sizeof(struct mailmsg));
  222. X      if (quit) Printf("Mailchk, removed\n");
  223. X      else Printf("Mailchk, changed parameters\n");
  224. X      goto fail;
  225. X      }
  226. X      else if (!(MailPort = CreatePort(buf,0))) goto fail;
  227. X    }
  228. X    if (numsecs == 0) numsecs = 40L;
  229. X    if (SpeakPlease == 2) SpeakPlease = 1;
  230. X    if (WindowPlease == 2) WindowPlease = 1;
  231. X    IntuitionBase = (long)OpenLibrary("intuition.library", 0);
  232. X    GfxBase = (long)OpenLibrary("graphics.library", 0);
  233. X    chan = DOpen(host, PORT_MAILCHK, 0, 0);
  234. X    if (chan == NULL) {
  235. X    Puts("no connect");
  236. X    goto fail;
  237. X    }
  238. X
  239. X    if ((FileReq = ArpAllocFreq()) == NULL) goto fail;
  240. X    FileReq->fr_Hail = "Save message to which file?";
  241. X    FileReq->fr_Dir = "MAIL:";
  242. X/*    InitDeemuNW(Deemu+DMNWOFF, &Nw); */
  243. X    InitDeemuNW(Deemu+DMICONNWOFF, &IconNW);
  244. X    if ((MbWin = OpenWindow(&IconNW)) == NULL) goto fail;
  245. X    refreshmenu();
  246. X    SetMenuStrip(MbWin,Menu);
  247. X    OffMenu(MbWin,MENUSTRIP(1));
  248. X    if (initmailserver(chan,numsecs,firstrun))
  249. X     checkmail(chan,numsecs);
  250. X
  251. Xfail:
  252. X    if (Win)
  253. X    CloseWinSafely(Win);
  254. X    if (MbWin)
  255. X    CloseWindow(MbWin);
  256. X    if (MailPort)
  257. X    DeletePort(MailPort);
  258. X    if (chan)
  259. X    DClose(chan);
  260. X    if (IntuitionBase)
  261. X    CloseLibrary(IntuitionBase);
  262. X    if (GfxBase)
  263. X    CloseLibrary(GfxBase);
  264. X    if (ArpBase)
  265. X    CloseLibrary(ArpBase);
  266. X}
  267. X
  268. Xint param(ac,av,numsecs,quit,host)
  269. X
  270. Xchar *av[];
  271. XBYTE *quit;
  272. Xunsigned long *numsecs;
  273. XULONG *host;
  274. X
  275. X{
  276. X      register short i;
  277. X      for (i = 1; i < ac; ++i) {
  278. X    if (strncmp(av[i], "-N", 2) == 0) {
  279. X        *host = (ULONG) av[i]+2;
  280. X        continue;
  281. X    }
  282. X    if (strncmp(av[i],"-d",2) == 0) {
  283. X        continue;
  284. X    }
  285. X    if (strncmp(av[i],"-n",2) == 0) {
  286. X        continue;
  287. X    }
  288. X    if (strncmp(av[i],"-t",2) == 0) {
  289. X        *numsecs = atoi(av[i]+2);
  290. X        continue;
  291. X    }
  292. X    if (strncmp(av[i],"-q",2) == 0) {
  293. X        *quit = 1;
  294. X        break;
  295. X    }
  296. X    if (strncmp(av[i],"-s",2) == 0) {
  297. X        SpeakPlease = (BYTE) atoi(av[i]+2);
  298. X        continue;
  299. X    }
  300. X    if (strncmp(av[i],"-w",2) == 0) {
  301. X        WindowPlease = (BYTE) atoi(av[i]+2);
  302. X        continue;
  303. X    }
  304. X    if (strncmp(av[i],"-h",2) != 0) {
  305. X        Printf("Illegal switch:  %s\n",av[i]);
  306. X    }
  307. X    Printf("DNET    - (C) Matthew Dillon 1988\n");
  308. X    Printf("%s\n",MailVersion);
  309. X    Printf("\nUsage:  run mailchk [-N(host) -t(time) -s(flag) -w(flag) q|h]\n");
  310. X    Printf("        -t(time) Interval between checks in seconds [DEFAULT = 40 seconds]\n");
  311. X    Printf("        -N(network id) Dnet network number\n");
  312. X    Printf("        -s(flag) 0 = do not speak, 1 = speak [DEFAULT]\n");
  313. X    Printf("        -w(flag) 0 = no window, 1 = window [DEFAULT]\n");
  314. X    Printf("        -q Remove the MailChk client, if it is running\n");
  315. X    Printf("        -h This message...\n");
  316. X    return(0);
  317. X      }
  318. X      return(1);
  319. X}
  320. X
  321. Xinitmailserver(chan,numsecs,firstrun)
  322. X
  323. Xlong chan, numsecs;
  324. Xchar firstrun;
  325. X
  326. X{
  327. X  char init = INITSERVER;
  328. X
  329. X    if ((DWrite(chan,&init,1) == 1) && (DWrite(chan,&numsecs,4) == 4)
  330. X     && (DWrite(chan,&firstrun,1) == 1)) return(1);
  331. X    return(0);
  332. X
  333. X}
  334. X
  335. Xcheckmail(chan,numsecs)
  336. X
  337. Xlong chan, numsecs;
  338. X
  339. X{
  340. X    long imask, dmask, omask, mask;
  341. X    char notdone = 1, nowindow = 0;
  342. X    ULONG prsec = 0, prmic = 0, prsec2 = 0, prmic2 = 0;
  343. X    BYTE pos = 0, oldpos = 0;
  344. X
  345. X    dmask   = 1 << ((PORT *) chan)->mp_SigBit;
  346. X    omask   = 1 << MailPort->mp_SigBit;
  347. X    imask   = 1 << MbWin->UserPort->mp_SigBit;
  348. X    while (notdone) {
  349. X    if (Win) {
  350. X        OnMenu(Win,MENUSTRIP(0));
  351. X        OnMenu(Win,MENUSTRIP(1));
  352. X    }
  353. X    OnMenu(MbWin,MENUSTRIP(0));
  354. X    mask = Wait(imask|dmask|omask|SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_E);
  355. X    OffMenu(MbWin,MENUSTRIP(0));
  356. X    if (Win) {
  357. X        OffMenu(Win,MENUSTRIP(0));
  358. X        OffMenu(Win,MENUSTRIP(1));
  359. X    }
  360. X    if (mask & SIGBREAKF_CTRL_C) {
  361. X        notdone = 0; break; }
  362. X    if (mask & omask) {
  363. X        struct mailmsg *msg;
  364. X        BYTE quit = 0;
  365. X
  366. X        while (msg = (struct mailmsg *) GetMsg(MailPort)) {
  367. X          if (msg->secs > 0) numsecs = msg->secs;
  368. X          quit |= msg->quit;
  369. X          if (msg->speak < 2) SpeakPlease = msg->speak;
  370. X          if (msg->win < 2) WindowPlease = msg->win;
  371. X          if (msg->secs > 0)
  372. X          initmailserver(chan,numsecs,2);
  373. X          ReplyMsg(msg);
  374. X        }
  375. X        if (quit) { notdone = 0; break; }
  376. X    }
  377. X    if (mask & SIGBREAKF_CTRL_E) {
  378. X        initmailserver(chan,numsecs,2);
  379. X        continue;
  380. X    }
  381. X    if (mask & imask) {
  382. X        IMESS *im;
  383. X        ULONG class, code;
  384. X
  385. X        while (im = (IMESS *) GetMsg(MbWin->UserPort)) {
  386. X        class = im->Class;
  387. X        switch(class) {
  388. X        case GADGETDOWN:
  389. X            if (im->IDCMPWindow != MbWin || NumMsg == 0) {
  390. X            ReplyMsg(im);
  391. X            break;
  392. X            }
  393. X            if (DoubleClick(prsec2,prmic2,im->Seconds,im->Micros)) {
  394. X            ReplyMsg(im);
  395. X            if (Win) {
  396. X                WindowToFront(Win);
  397. X                break;
  398. X            }
  399. X            else if (WindowPlease) {
  400. X                 Win = OpenWindow(&Nw);
  401. X                 if (Win != NULL) {
  402. X                     Rp = Win->RPort;
  403. X                     Win->UserPort = MbWin->UserPort;
  404. X                     ModifyIDCMP(Win,IDCMPFLAGS);
  405. X                     refreshmenu();
  406. X                     SetMenuStrip(Win,Menu);
  407. X                     OffMenu(Win,MENUSTRIP(0));
  408. X                     OffMenu(Win,MENUSTRIP(1));
  409. X                 }
  410. X                 }
  411. X            newimage(YOUHAVEMAIL);
  412. X            if (NumMsg == 65535) getnewmail(chan);
  413. X            else {
  414. X                strcpy(Title,MailVersion);
  415. X                dispnewmail(0,0,1);
  416. X            }
  417. X            }
  418. X            else {
  419. X              prsec2 = im->Seconds;
  420. X              prmic2 = im->Micros;
  421. X              ReplyMsg(im);
  422. X            }
  423. X            break;
  424. X        case NEWSIZE:
  425. X            dispnewmail(pos,0,1);
  426. X            break;
  427. X        case MOUSEBUTTONS:
  428. X            if (im->Code == SELECTUP) {
  429. X              if (DoubleClick(prsec,prmic,im->Seconds,im->Micros)
  430. X              && pos == oldpos) {
  431. X            if (pos > 0) {
  432. X                getmailmsg(chan,pos,0);
  433. X            }
  434. X              }
  435. X              else {
  436. X              prsec = im->Seconds;
  437. X              prmic = im->Micros;
  438. X                }
  439. X              if (pos == 0) dispnewmail(0,oldpos,0);
  440. X              else oldpos = pos;
  441. X            }
  442. X            else if (im->Code == SELECTDOWN) {
  443. X                 register short i=1;
  444. X                 short temp;
  445. X                 struct MailMsg *p = MailP;
  446. X
  447. X                 temp = (im->MouseY - Win->BorderTop) / Rp->TxHeight + 1;
  448. X                 while ( i != temp && p != NULL) {
  449. X                i++;
  450. X                p = p->next;
  451. X                 }
  452. X                 if (p == NULL) { oldpos = pos; pos = 0;}
  453. X                 else { pos = temp;
  454. X                    dispnewmail(pos,oldpos,0);
  455. X                  }
  456. X             }
  457. X            break;
  458. X        case CLOSEWINDOW:
  459. X            nowindow = 1;
  460. X            break;
  461. X        case MENUPICK:
  462. X            code = im->Code;
  463. X            ReplyMsg(im);
  464. X            switch((uword)((MENUNUM(code)<<8)|ITEMNUM(code))) {
  465. X            case 0x0100:    /*    View    */
  466. X            getmailmsg(chan,pos,0);
  467. X            break;
  468. X            case 0x0101:    /*    Print    */
  469. X            getmailmsg(chan,pos,1);
  470. X            break;
  471. X            case 0x0102:    /*    Delete    */
  472. X            delmailmsg(chan,pos);
  473. X            break;
  474. X            case 0x0103:    /*    Save    */
  475. X            getmailmsg(chan,pos,2);
  476. X            break;
  477. X            case 0x0104:    /*    Speak    */
  478. X            getmailmsg(chan,pos,3);
  479. X            break;
  480. X            case 0x0105:    /*    Reply    */
  481. X            editmessage(chan,pos);
  482. X            break;
  483. X            case 0x0000:    /*    Talk    */
  484. X            SpeakPlease = 1 - SpeakPlease;
  485. X            break;
  486. X            case 0x0001:    /*    Window    */
  487. X            WindowPlease = 1 - WindowPlease;
  488. X            break;
  489. X            case 0x0002:    /*    Remove    */
  490. X            notdone = 0;
  491. X            break;
  492. X            }
  493. X        }
  494. X        if (class != MENUPICK && class != GADGETDOWN) ReplyMsg(im);
  495. X        }
  496. X    }
  497. X    if (mask & dmask) {
  498. X        char len = 0;
  499. X        short temp = 0;
  500. X
  501. X        if (DNRead(chan, &len, 1) != 0) {
  502. X        if (len < sizeof(Title) && DRead(chan, Title, len) == len) {
  503. X            Title[len-1] = 0;
  504. X            if (strncmp(Title,"No mail",7) == 0) {
  505. X            nowindow = 1;
  506. X            freemail(MailP);
  507. X            newimage(NOMAIL);
  508. X            }
  509. X            else { if (strncmp(Title,"New mail",8) == 0) {
  510. X                   DisplayBeep(NULL);
  511. X                   newimage(NEWMAIL);
  512. X                   Delay(50);
  513. X                   DisplayBeep(NULL);
  514. X               }
  515. X               else newimage(YOUHAVEMAIL);
  516. X               if (SpeakPlease) {
  517. X                   char *Speaker;
  518. X                   struct FileHandle *fh;
  519. X
  520. X                   Speaker = GetDEnv("SPEAKER");
  521. X                   if (Speaker == NULL) Speaker = DefaultSpeaker;
  522. X                   fh = Open(Speaker,1006);
  523. X                   if (fh) {
  524. X                   if (strncmp(Title,"New",3) == 0)
  525. X                       Write(fh,"You have new mail.",18);
  526. X                   else Write(fh,"You have mail.",14);
  527. X                   Close(fh);
  528. X                   }
  529. X               }
  530. X               NumMsg = -1;
  531. X               if (Win) {
  532. X                   WindowToFront(Win);
  533. X                   getnewmail(chan);
  534. X                   newimage(YOUHAVEMAIL);
  535. X               }
  536. X               if (!SpeakPlease && !WindowPlease) {
  537. X                   Puts(Title);
  538. X                   getnewmail(chan);
  539. X               }
  540. X            }
  541. X        }
  542. X        }
  543. X        else if (DCheckEof(chan)) notdone = 0;
  544. X    }
  545. X    if (nowindow && Win) {
  546. X        ClearMenuStrip(Win);
  547. X        Nw.LeftEdge = Win->LeftEdge;
  548. X        Nw.TopEdge = Win->TopEdge;
  549. X        Nw.Width = Win->Width;
  550. X        Nw.Height = Win->Height;
  551. X        CloseWinSafely(Win);
  552. X        Win = NULL;
  553. X    }
  554. X    nowindow = 0;
  555. X    }
  556. X
  557. X    freemail(MailP);
  558. X    if (Win) {
  559. X    ClearMenuStrip(Win);
  560. X    CloseWinSafely(Win);
  561. X    Win = NULL;
  562. X    }
  563. X}
  564. X
  565. X/*
  566. X *  Utility routines.    ************************************************
  567. X */
  568. X
  569. Xrefreshmenu()
  570. X
  571. X/* Refresh the two toggle menus(Talk, Window) in the Project strip
  572. X * according to the flags SpeakPlease and WindowPlease.
  573. X */
  574. X
  575. X{
  576. X   struct MenuItem *mn_ad;
  577. X
  578. X   mn_ad = (struct MenuItem *) ItemAddress(Menu,SHIFTMENU(0)|SHIFTITEM(0));
  579. X   if (SpeakPlease) mn_ad->Flags |= CHECKED;
  580. X   else mn_ad->Flags &= ~(CHECKED);
  581. X   mn_ad = (struct MenuItem *) ItemAddress(Menu,SHIFTMENU(0)|SHIFTITEM(1));
  582. X   if (WindowPlease) mn_ad->Flags |= CHECKED;
  583. X   else mn_ad->Flags &= ~(CHECKED);
  584. X}
  585. X
  586. Xnewimage(index)
  587. X
  588. X/* Change the mailbox icon.
  589. X * Values of index:
  590. X * 0 -> "You have mail", 1-> "New mail", 2-> "No mail"
  591. X */
  592. X
  593. X{
  594. X  MbImage.ImageData = &MbBitMap[index][0];
  595. X  RefreshGList(&gadget,MbWin,NULL,1);
  596. X}
  597. X
  598. X
  599. Xgetnewmail(chan)
  600. X
  601. Xlong chan;
  602. X
  603. X/* Get all messages (headers only) from the host.
  604. X * It will also display thoses headers using dispnewmail().
  605. X * The magic number 1 is used to tell the server what we want.
  606. X */
  607. X
  608. X{
  609. X  unsigned char len = GETNEWMAIL;
  610. X  struct MailMsg *p;
  611. X  register USHORT count = 0;
  612. X
  613. X  if (Win) {
  614. X      BUSYPOINTER(Win);
  615. X      SetWindowTitles(Win,MailVersion,-1);
  616. X  }
  617. X  freemail(MailP);
  618. X  if (DWrite(chan, &len, 1) == 1 && DRead(chan, &len, 1) == 1) {
  619. X      while (len > 0) {
  620. X    if (MailP) {
  621. X        p->next = AllocMem(sizeof(*p),0);
  622. X        p = p->next;
  623. X    }
  624. X    else {
  625. X        MailP = AllocMem(sizeof(*p),0);
  626. X        p = MailP;
  627. X    }
  628. X    if (p == NULL) break;
  629. X    else p->next = NULL;
  630. X    if (len < MAILLENGTH && (DRead(chan, p->msg, len) == len)) {
  631. X        p->msg[len-1] = '\0';
  632. X        DRead(chan,&len,1);
  633. X        count++;
  634. X    }
  635. X    else break;
  636. X
  637. X      }
  638. X  }
  639. X  NumMsg = count;
  640. X  if (Win) ClearPointer(Win);
  641. X  dispnewmail(0,0,1);
  642. X}
  643. X
  644. Xdispnewmail(ONmsgno,OFFmsgno,flag)
  645. X
  646. XBYTE ONmsgno, OFFmsgno, flag;
  647. X
  648. X/* Display mail headers in a window if one is opened or on stdout otherwise.
  649. X * ONmsgno :  msg no to be output in reverse ( 0 = none)
  650. X * OFFmsgno:  msg no to be output normally.
  651. X * flag    :  1 -> It's a new window, 0 -> it's an old window
  652. X */
  653. X
  654. X{
  655. X  char th, tb, tw;
  656. X  short y, Wh, Ww, WOx, WOy;
  657. X  int len;
  658. X  struct MailMsg *p;
  659. X  BYTE i=1;
  660. X
  661. X  p = MailP;
  662. X  if (Win != NULL) {
  663. X      th = Rp->TxHeight;
  664. X      tb = Rp->TxBaseline;
  665. X      tw = Rp->TxWidth;
  666. X      y = Win->BorderTop;
  667. X      Ww = Win->Width - Win->BorderRight - Win->BorderLeft;
  668. X      Wh = Win->Height- Win->BorderTop - Win->BorderBottom;
  669. X      WOx = Win->BorderLeft;
  670. X      WOy = Win->BorderTop;
  671. X      if (flag) {
  672. X      char buf[25], buf2[9];
  673. X
  674. X      SetAPen(Rp, 0);
  675. X      RectFill(Rp, WOx, WOy, Ww + WOx, Wh + WOy);
  676. X      WindowToFront(Win);
  677. X      strcpy(buf2,"message");
  678. X      if (NumMsg > 1) strcat(buf2,"s");
  679. X      sprintf(buf," (%d %s)",NumMsg,buf2);
  680. X      if (Title[strlen(Title)-1] != ')') strcat(Title,buf);
  681. X      SetWindowTitles(Win, Title, -1);
  682. X      }
  683. X  }
  684. X  while (p != NULL && ((Win == NULL) || ((y+tb) < Wh))) {
  685. X    short tl;
  686. X
  687. X    if (! Win && flag) Puts(p->msg);
  688. X    else { if (flag || i == ONmsgno || i == OFFmsgno) {
  689. X           if (ONmsgno == i) {
  690. X           SetBPen(Rp,2);
  691. X           SetAPen(Rp,0);
  692. X           }
  693. X           else {
  694. X           SetAPen(Rp,2);
  695. X           SetBPen(Rp,0);
  696. X           }
  697. X           len = strlen(p->msg);
  698. X           tl = TextLength(Rp,p->msg,len);
  699. X           if (tl > Ww) len = Ww / tw;
  700. X           Move(Rp,Win->BorderLeft,y+tb);
  701. X           Text(Rp,p->msg,len);
  702. X           if (ONmsgno == i) SetAPen(Rp,2);
  703. X           else if (OFFmsgno == i || flag) SetAPen(Rp,0);
  704. X           RectFill(Rp,Rp->cp_x,y,Ww+WOx,y+th-1);
  705. X       }
  706. X       y += th;
  707. X       i++;
  708. X    }
  709. X    p = p->next;
  710. X  }
  711. X}
  712. X
  713. Xdelmailmsg(chan,msgno)
  714. X
  715. Xlong chan;
  716. XBYTE msgno;
  717. X
  718. X/* Send a command to the server asking it to delete message number msgno.
  719. X */
  720. X
  721. X{
  722. X  register BYTE i=1;
  723. X  struct MailMsg *p = MailP;
  724. X  char dummy[32];
  725. X  BYTE dl = DELMAILMSG, ok;
  726. X  unsigned long stchar = 0,nochars;
  727. X
  728. X  BUSYPOINTER(Win);
  729. X  for (i=1; (i != msgno && p != NULL); i++) {
  730. X    getmailprm(p,&nochars,dummy);
  731. X    stchar += nochars;
  732. X    p = p->next;
  733. X  }
  734. X  if (p == NULL) return();
  735. X  getmailprm(p,&nochars,dummy);
  736. X
  737. X  if ((DWrite(chan,&dl,1) == 1) &&
  738. X      (DWrite(chan,&stchar,4) == 4) &&
  739. X      (DWrite(chan,&nochars,4) == 4) &&
  740. X      (DRead(chan,&ok,1) == 1)) {
  741. X      if (ok) strcpy(Title,"Delete successful ");
  742. X      else strcpy(Title,"Delete error ");
  743. X      getnewmail(chan);
  744. X  }
  745. X  ClearPointer(Win);
  746. X}
  747. X
  748. Xint getmailmsg(chan,msgno,flag)
  749. X
  750. Xlong chan;
  751. XBYTE msgno, flag;
  752. X
  753. X/* Get message number msgno from the host and take the following action
  754. X * according to the value of flag:
  755. X *
  756. X *    0 -> View the message on screen (using more or the env var PAGER)
  757. X *    1 -> Print the message on PRT:
  758. X *    2 -> Save the message in a file.
  759. X *    3 -> Send the message to the SPEAK: device (without the headers)
  760. X */
  761. X
  762. X{
  763. X  struct MailMsg *p = MailP;
  764. X  BYTE i, ok=0, hd = GETMAILMSG, l, start = 0;
  765. X  unsigned long stchar=0L, nochars, len;
  766. X  struct FileHandle *fh;
  767. X  ubyte *buf;
  768. X  char pname[128], vname[100], title[132], *tmp;
  769. X  int rcode = 1;
  770. X  struct NewShell *NS;
  771. X  if (NS = AllocMem(sizeof(*NS)+4096,MEMF_CLEAR)) {
  772. X      NS->nsh_StackSize = 4000;
  773. X      NS->nsh_Control = BACKGROUND_SHELL;
  774. X  }
  775. X  else return(rcode);
  776. X  strcpy(vname,"DPIPE:Mail");
  777. X  switch (flag) {
  778. X    case 0:              /* View */
  779. X      if ((tmp = GetDEnv("PAGER")) == NULL) {
  780. X      strcpy(pname,"sys:utilities/more");
  781. X      }
  782. X      else { strcpy(pname,tmp);
  783. X         free(tmp);
  784. X      }
  785. X      strcat(pname," ");
  786. X      strcat(pname,vname);
  787. X      strcpy(title,"Viewing ");
  788. X      start = 1;
  789. X      break;
  790. X    case 1:             /* Print */
  791. X      strcpy(vname,"PRT:");
  792. X      strcpy(title,"Printing ");
  793. X      break;
  794. X    case 2:             /* Save */
  795. X      if (!(FileRequest(FileReq))) {
  796. X        return(rcode);}
  797. X      strcpy(vname,FileReq->fr_Dir);
  798. X      TackOn(vname,FileReq->fr_File);
  799. X      strcpy(title,"Saving ");
  800. X      strcat(title,vname);
  801. X      break;
  802. X    case 3:             /* Speak */
  803. X      tmp = GetDEnv("SPEAKER");
  804. X      if (tmp == NULL) tmp = DefaultSpeaker;
  805. X      strcpy(vname,tmp);
  806. X      strcpy(title,"Speaking ");
  807. X      break;
  808. X  }
  809. X  buf = (ubyte *) (NS + sizeof(*NS));
  810. X  l = strlen(title);
  811. X  for (i=1; (i != msgno && p != NULL); i++) {
  812. X    getmailprm(p,&nochars,&len);
  813. X    stchar += nochars;
  814. X    p = p->next;
  815. X  }
  816. X  if (p == NULL) return(rcode);
  817. X  getmailprm(p,&nochars,&len);
  818. X  if (flag == 3) {stchar += len; nochars -= len; }
  819. X  if (flag == 0) {
  820. X      strcat(title," using ");
  821. X      strcat(title,pname);
  822. X  }
  823. X  BUSYPOINTER(Win);
  824. X  if (fh = Open(vname,1006)) {
  825. X      if (DWrite(chan, &hd, 1) == 1 && DWrite(chan, &stchar, 4) == 4
  826. X      && DWrite(chan,&nochars,4) == 4) {
  827. X      SetWindowTitles(Win, title, -1);
  828. X      while (DRead(chan,&len,4) == 4 && len > 0) {
  829. X        if (DRead(chan,buf,len) == len) {
  830. X        if (start) {
  831. X            if (ASyncRun(pname,0L,NS) < 0) {
  832. X            ok = 1;
  833. X            DWrite(chan,&ok,1);
  834. X            rcode = 0;
  835. X            break;
  836. X            }
  837. X            start = 0;
  838. X        }
  839. X        if (Write(fh,buf,len) != len) {
  840. X            ok = 1;
  841. X            DWrite(chan,&ok,1);
  842. X            rcode = 0;
  843. X            break;
  844. X        }
  845. X        DWrite(chan,&ok,1);
  846. X        }
  847. X      }
  848. X      }
  849. X      Close(fh);
  850. X  }
  851. X  else {
  852. X    rcode = 0;
  853. X    Printf("\nCould not open %s\n",vname);
  854. X  }
  855. X  SetWindowTitles(Win,Title,-1);
  856. X  FreeMem(NS,sizeof(*NS)+4096);
  857. X  ClearPointer(Win);
  858. X  return(rcode);
  859. X}
  860. X
  861. Xint editmessage(chan,msgno)
  862. X
  863. Xlong *chan;
  864. XUBYTE msgno;
  865. X
  866. X/* Reply to message number msgno using ed or the env var EDITOR.
  867. X * A temporary file in the T: directory is used.
  868. X *
  869. X * Still buggy for unknown reasons.
  870. X */
  871. X
  872. X{
  873. X  char *buf, fname[32];
  874. X  struct MailMsg *p = MailP;
  875. X  int ok = 0, test;
  876. X  struct FileInfoBlock *fileinfo;
  877. X  struct FileLock *lock;
  878. X  struct FileHandle *fh = NULL;
  879. X  LONG len;
  880. X  short count;
  881. X  BYTE hd = EDITMESSAGE, i;
  882. X
  883. X  if (!(fileinfo = AllocMem(sizeof(struct FileInfoBlock)+BUFLENGTH,0)))
  884. X      return(ok);
  885. X  buf = (char *) (fileinfo + sizeof(struct FileInfoBlock));
  886. X  strcpy(fname,"T:MailChk");
  887. X  strcpy(Title,"Replying...");
  888. X  SetWindowTitles(Win,Title,-1);
  889. X  if (GetDEnv("EDITOR") != NULL) strcpy(buf,GetDEnv("EDITOR"));
  890. X  else strcpy(buf,"ed");
  891. X  BUSYPOINTER(Win);
  892. X  if (SyncRun(buf,fname,0,0) >= 0) {
  893. X      if (((lock = Lock(fname,ACCESS_READ)) != 0) &&
  894. X    Examine(lock,fileinfo)) {
  895. X    len = fileinfo->fib_Size;
  896. X    UnLock(lock);
  897. X    strcpy(Title,"Could not open tmp file");
  898. X    if (!(fh = Open(fname,1005))) goto fin;
  899. X    strcpy(Title,"Inconsistency error");
  900. X    for (i=1; (i != msgno && p != NULL); i++)
  901. X         p = p->next;
  902. X    if (p == NULL) goto fin;
  903. X    sscanf(p->msg+1,"%d %s",&test,buf);
  904. X    if (test != msgno) goto fin;
  905. X    strcpy(Title,"Transmission error");
  906. X    if (DWrite(chan,&hd,1) != 1) goto fin;
  907. X    count = strlen(buf);
  908. X    if (DWrite(chan,&count,2) != 2) goto fin;
  909. X    if (DWrite(chan,buf,count) != count) goto fin;
  910. X    if (DWrite(chan,&len,4) != 4) goto fin;
  911. X    do {
  912. X      count = Read(fh,buf,BUFLENGTH);
  913. X      if (count > 0 && DWrite(chan,buf,count) != count) goto fin;
  914. X    } while (count == BUFLENGTH);
  915. X    strcpy(Title,"Remote error");
  916. X    if (DRead(chan,&ok,1) != 1) ok = 0;
  917. X      }
  918. X      else {
  919. X      strcpy(Title,"Reply function cancelled");
  920. X      goto fin2;
  921. X      }
  922. X  }
  923. X  else { sprintf(Title,"Editor %s not found",buf);
  924. X     goto fin2;
  925. X  }
  926. Xfin:
  927. X  if (fh) Close(fh);
  928. X  if (ok) {
  929. X      DeleteFile(fname);
  930. X      strcpy(Title,"Reply was suscessful");
  931. X  }
  932. X  else {
  933. X      DeleteFile("T:dead.letter");
  934. X      Rename(fname,"T:dead.letter");
  935. X      strcat(Title," - Letter is in T:dead.letter");
  936. X  }
  937. Xfin2:
  938. X  SetWindowTitles(Win,Title,-1);
  939. X  ClearPointer(Win);
  940. X  FreeMem(fileinfo,sizeof(struct FileInfoBlock)+BUFLENGTH);
  941. X  return(ok);
  942. X}
  943. X
  944. Xgetmailprm(p,nochars,len)
  945. X
  946. Xstruct MailMsg *p;
  947. Xunsigned long *nochars, *len;
  948. X
  949. X/* Extract the no of chars (nochars) from a particular header (pointed to
  950. X * by p) in the message and the no of chars without the header lines
  951. X * (len).
  952. X */
  953. X
  954. X{
  955. X  char *str;
  956. X
  957. X  if (str = rindex(p->msg,'/')) {
  958. X      sscanf(++str,"%ld %ld",nochars,len);
  959. X  }
  960. X  else *nochars = 0;
  961. X}
  962. X
  963. Xfreemail(p)
  964. X
  965. Xstruct MailMsg *p;
  966. X
  967. X/* Free all the memory used by the linked list
  968. X */
  969. X
  970. X{
  971. X  while (p != NULL) {
  972. X    FreeMem(p,sizeof(*p));
  973. X    p = p->next;
  974. X  }
  975. X  MailP = NULL;
  976. X  NumMsg = 0;
  977. X}
  978. X
  979. XCloseWinSafely(win)
  980. X
  981. XWIN *win;
  982. X
  983. X/* From RKM 1.3.
  984. X * Close window win safely when it shares an IDCMP port with other
  985. X * windows.
  986. X */
  987. X
  988. X{
  989. X  Forbid();
  990. X  StripIntuiMessages(win->UserPort,win);
  991. X  win->UserPort = NULL;
  992. X  ModifyIDCMP(win,0);
  993. X  Permit();
  994. X  CloseWindow(win);
  995. X}
  996. X
  997. XStripIntuiMessages(mp,win)
  998. X
  999. XPORT *mp;
  1000. XWIN *win;
  1001. X
  1002. X/* From RKM 1.3 */
  1003. X
  1004. X{
  1005. X  IMESS *msg, *succ;
  1006. X
  1007. X  msg = (IMESS *) mp->mp_MsgList.lh_Head;
  1008. X  while (succ = (IMESS *) msg->ExecMessage.mn_Node.ln_Succ) {
  1009. X    if (msg->IDCMPWindow == win) {
  1010. X    Remove(msg);
  1011. X    ReplyMsg(msg);
  1012. X    }
  1013. X    msg = succ;
  1014. X  }
  1015. X}
  1016. X
  1017. END_OF_FILE
  1018. if test 23145 -ne `wc -c <'amiga/client/mailchk.c'`; then
  1019.     echo shar: \"'amiga/client/mailchk.c'\" unpacked with wrong size!
  1020. fi
  1021. # end of 'amiga/client/mailchk.c'
  1022. fi
  1023. echo shar: End of archive 2 \(of 3\).
  1024. cp /dev/null ark2isdone
  1025. MISSING=""
  1026. for I in 1 2 3 ; do
  1027.     if test ! -f ark${I}isdone ; then
  1028.     MISSING="${MISSING} ${I}"
  1029.     fi
  1030. done
  1031. if test "${MISSING}" = "" ; then
  1032.     echo You have unpacked all 3 archives.
  1033.     rm -f ark[1-9]isdone
  1034. else
  1035.     echo You still need to unpack the following archives:
  1036.     echo "        " ${MISSING}
  1037. fi
  1038. ##  End of shell archive.
  1039. exit 0
  1040. -- 
  1041. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  1042. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  1043. Post requests for sources, and general discussion to comp.sys.amiga.
  1044.